/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cc.uah.es.snomedctsubsetextractor;

import edu.uci.ics.jung.algorithms.util.SettableTransformer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.io.PajekNetWriter;
import java.util.concurrent.ConcurrentLinkedQueue;

import org.apache.commons.collections15.Transformer;

/**
 *
 * @author Luis
 */
public class SubsetPajek {

    static ConcurrentLinkedQueue<SNOMEDConcept> concepts;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        BufferedReader inSubset = null;
        
        try {
            System.out.println("::::::::START - Pajek Converter::::::::");
            String strLine;
            // Ruta donde se encuentra el fichero de configuraci�n de la base de datos.
            String pathdb = System.getProperty("user.dir") + File.separator + "etc" + File.separator + "confdb.xml";
            String path = System.getProperty("user.dir") + File.separator + "etc" + File.separator;

            //inSubset = new BufferedReader(new FileReader(path + "Glossary-CancerOvario-Subset.txt"));
            inSubset = new BufferedReader(new FileReader(path + args[0]));

            // Ruta donde almacenar el fichero pajek generado.

            //String pathPajek = path + "Glossary-CancerOvario-Subset-pajek.txt";
            String pathPajek = path + args[0].substring(0, args[0].length() - 4) + "-pajek.txt";

            // Lista de conceptos
            concepts = new ConcurrentLinkedQueue<SNOMEDConcept>();
            while ((strLine = inSubset.readLine()) != null) {

                String[] arrayConcept = strLine.split(";");

                if (arrayConcept[0].equalsIgnoreCase("138875005") == false)
                    concepts.add(new SNOMEDConcept(Integer.valueOf(arrayConcept[0]), arrayConcept[1]));

            }
            inSubset.close();
            SNOMEDCTConfigurator DBConf = new SNOMEDCTConfigurator(pathdb);
            SNOMEDCTRepository repo = new SNOMEDCTDatabase(DBConf);
            // Objeto para crear estructura pajek
            PajekNetWriter pnw = new PajekNetWriter();
            //Obtenemos el grafo de la base de datos.
            Graph<String, String> g = repo.getGraph(concepts);
            //Objeto que pinta el grafo con JUNG
            //SimpleGraphView gv = new SimpleGraphView(g);
            //gv.printTree();

            //////////////////////////////////////////////////////
            //el vertexLabeller es quien devuelve el nombre que se le va a poner 
            //a cada nodo (en mi caso los nodos son instancias de la clase Tag)
            //El transform es para exportar a pajek adecuadamente y el set es para importar de pajek
            //adecuadamente
            SettableTransformer<String, String> vertexLabeller;
            vertexLabeller = new SettableTransformer<String, String>() {

                public String transform(String i) {
                    return i;
                }

                public void set(String i, String val) {
                    i = val;
                }
            };

            Transformer<String, Number> wtTransformer = new Transformer<String, Number>(){

                public Number transform(String link) {
                    int left = link.indexOf("[");
                    int right = link.indexOf("]");

                    // pull out the text inside the parens
                    String relationshype = link.substring(left + 1, right);

                    if (relationshype.compareTo("116680003") == 0) {
                        return 1.0;
                    } else {
                        return 5.0;
                    }
                }

                public void set(String i, Number o) {
                    i = String.valueOf(o);
                }
            };
            
            ///////////////////////////////////////////////////////////
            //crear el fichero pajek. En el código este también se pasa un edgeSetter porque yo necesitaba
            //poner peso a las aristas (edges) pero en tu caso creo que todas las aristas son iguales no??
            //
            PajekNetWriter<String, String> pajWriter = new PajekNetWriter<String, String>();


            // Transformamos el grafo a formato Pajek y lo almacenamos
            try {
                //pnw.save(g, pathPajek);
                //pnw.save(g, pathPajek, vs, null);
                pajWriter.save(g, pathPajek, vertexLabeller, wtTransformer);

            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("::::::::THE END - Pajek Converter::::::::");
        } catch (IOException ex) {
            Logger.getLogger(SubsetPajek.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                inSubset.close();
            } catch (IOException ex) {
                Logger.getLogger(SubsetPajek.class.getName()).log(Level.SEVERE, null, ex);
            }
        }



    }
}
